#!/bin/sh

# 这个脚本会每隔10分钟发送匿名统计数据，只包括：
# 1. 随机的id，在服务器第一次启动时随机生成，不包含任何隐私数据
# 2. 当前平台的注册人数
# 3. 平台运行时长（每次收到请求，增加10分钟时长）
# 3. 平台总的答案提交次数

# 定义配置参数
LEARNCTF_DIR="/learnctf"
ID_FILE="${LEARNCTF_DIR}/id"
ID=""
REPORT_URL="https://learnctf.top/report/add"
# PostgreSQL连接参数
PG_HOST="db"
PG_PORT="5432"
PG_DB="gzctf"
PG_USER="postgres"
PG_PASSWORD=$(grep Database /app/appsettings.json | cut -d = -f 5 | cut -d '"' -f 1)

# 初始化操作 - 仅在第一次启动时执行
initialize() {
    if [ ! -f "${ID_FILE}" ]; then
        cat /proc/sys/kernel/random/uuid | tr '[:upper:]' '[:lower:]' > "${ID_FILE}"
    fi
    ID=$(cat "${ID_FILE}")
}

# 获取用户数量
get_user_count() {
    # 查询用户数量
    count=$(PGPASSWORD="${PG_PASSWORD}" psql -h "${PG_HOST}" -p "${PG_PORT}" -U "${PG_USER}" -d "${PG_DB}" -t -c 'SELECT COUNT(*) FROM "AspNetUsers";' 2>/dev/null | tr -d '[:space:]')

    # 处理查询结果
    if [ -z "${count}" ] || ! echo "${count}" | grep -q '^[0-9]\+$'; then
        echo "0"
    else
        echo "${count}"
    fi
}

# 获取答案总提交次数
get_answer_count() {
    count=$(PGPASSWORD="${PG_PASSWORD}" psql -h "${PG_HOST}" -p "${PG_PORT}" -U "${PG_USER}" -d "${PG_DB}" -t -c 'SELECT COUNT(*) from "Submissions";' 2>/dev/null | tr -d '[:space:]')

    # 处理查询结果
    if [ -z "${count}" ] || ! echo "${count}" | grep -q '^[0-9]\+$'; then
        echo "0"
    else
        echo "${count}"
    fi
}

# 发送报告
send_report() {
    local user_count=$(get_user_count)
    local answer_count=$(get_answer_count)

    echo "report ID: ${ID}, users: ${user_count}, answers: ${answer_count}"

    # 使用wget发送POST请求，--post-data指定表单数据
    wget -q -O /dev/null \
            --post-data="id=${ID}&user_count=${user_count}&answer_count=${answer_count}" \
            "${REPORT_URL}"
}

# 定期发送报告的函数
start_reporting() {
    echo "start reporting..."
    while true; do
        sleep 600
        send_report
    done
}

# 主流程
main() {
    initialize

    # 获取并显示ID
    echo "id: ${ID}"

    # 启动定期报告
    start_reporting
}

# 启动主流程
main >> /var/log/learnctf.log 2>&1 &
# 运行gzctf
dotnet GZCTF.dll
